package com.yc.动态代理.CGLIB动态代理;

import com.yc.动态代理.静态代理.抽象主题;
import com.yc.动态代理.静态代理.真实主题;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CGLIB动态代理 {

    private 抽象主题 target;

    public 抽象主题 proxy(抽象主题 target){
        this.target = target;
        // CGLIB 是基于动态字节码技术 ==> 通过继承实现代理
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass()); // 设置父类
        // 设置回调函数
        enhancer.setCallback(new MethodInterceptor(){
            @Override
            public Object intercept(Object proxy,               // 代理对象
                                    Method method,          // 方法对象
                                    Object[] objects,       // 方法参数
                                    MethodProxy methodProxy // 方法代理对象
                ) throws Throwable {
                System.out.println("前置增强");
                Object ret = methodProxy.invoke(target, objects); // 调用业务方法
                System.out.println("后置增强");
                return ret;
            }
        });
        return (抽象主题) enhancer.create(); //构建代理对象
    }

    public static void main(String[] args) {
        抽象主题 a = new 真实主题();
        CGLIB动态代理 b = new CGLIB动态代理();
        抽象主题 proxy = b.proxy(a);
        proxy.sayHello();
    }

}
